Ceph and OpenStack 現在已經是 IaaS 中成雙成對的一個組合。根據 2017 年 6-12 月的 OpenStack User Survey,在所有 OpenStack Deployment 中,有 57% 的部署使用的 Cinder backend 為 Ceph RBD。當然在使用 Ceph 作為 OpenStack Glance, Cinder 的 backend 會有一些能夠在設定上調整的最佳實踐。本篇文章將會介紹這些如何調整以及為什麼要進行這些設定。
使用 Ceph RBD 時,預設會開啟 RBD Layering 這個功能,可以把它想像成一個可以讀寫 snapshot。這會建立一個原本 image 的 clone,而 Ceph 就只會建立跟原本 image 不同部分的 RADOS Objects。這代表了兩件事:
Cinder 跟 Nova 預設都會利用 RBD Layering 的功能,但是會需要在 Glance 中的 glance-api.conf
設定 show_image_direct_url=true
並且使用 Glance v2 API。
由於安全性問題,目前 Ceph community 建議把 show_image_direct_url
設為 false
。
librbd,也就是 qemu/kvm 跟 RBD 儲存裝置溝通的 driver,可以利用主機的 RAM 作為 RBD 的 disk cache 使用
使用這種 cache 是安全的,virtio-blk
跟 Qemu RBD storage driver 會確保資料被正確的 flush。當 VM 中的應用程式告知說「我要這個檔案在 disk 上」時,Qemu 跟 Ceph 會在完成下列事項中才回報資料已經被寫入:
Ceph 本身也有內建的防呆機制,就算 cache 被設成 write-back mode,Ceph 在收到 user 的第一個 flush request 之前都會以 write-through mode 運作。這個機制相對應的設定是 rbd cache writethrough until flush
,預設是設為 true
,永遠永遠不要嘗試關閉它。
要啟用 Ceph 的 cache 必須在 nova-compute 的 nova.conf 中設定
[libvirt]
...
images_type = rbd
disk_cachemodes="network=writeback"
讓三個不同的 service 使用不同的 Ceph pool 有幾個原因:
有些能可能擔心在分開 pool 後 RBD layering 會無法作用,但是不用擔心,這些 clone 是可以跨 pool 做使用的。
所以在 OpenStack 部署中看到 3 個不同的 Ceph Pool 是一件非常常見是事情,一個給 Cinder,一個給 Glance,一個給 Nova。
使用 SSD WAL 跟 DB 不會增加讀取速度。要利用 SSD 快速的讀取速度,就把它們獨立成 OSD 並且利用 crush_ruleset 設定 All-flash OSD Pool。在 Luminous 版本之後,Ceph 會自動偵測 device class,所以要創建 All-flash 的 crush rule 非常容易。
例如要創建一個 All-flash pool (faliure domain: host) 叫做 flash,用 command ceph osd crush rule create-replicated <rule-name> <root> <failure-domain-type> <device-class>
ceph osd crush rule create-replicated fast default host ssd
要安裝 OpenStack 跟 Ceph 的教學可以參考之前寫過的文章:
The Dos and Don'ts for Ceph for OpenStack